// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

using System.Reflection;
using System.Text;

namespace OpenTelemetry.Instrumentation.ServiceFabricRemoting.Tests;

internal static class ServiceFabricUtils
{
    private static readonly ulong[] Crc64Table = new ulong[256]
    {
        0uL, 4823603603198064275uL, 9647207206396128550uL, 14344283933443513269uL, 5274672035359026399uL, 847670339082705484uL, 14759040976900489721uL, 10241823793177474922uL, 10549344070718052798uL, 15030250704074698541uL,
        1695340678165410968uL, 6158653484774949387uL, 15804726273676621153uL, 11071337880091427826uL, 6824194888265062471uL, 2036903512645398228uL, 7367177604490692079uL, 2651944067726553980uL, 16419204125234161865uL, 11613757334439845466uL,
        3390681356330821936uL, 7926053118503640995uL, 12317306969549898774uL, 16726154088988619397uL, 17607865585094646865uL, 13162708473643690690uL, 8194994013375312247uL, 3695931686473304036uL, 13648389776530124942uL, 18417527692557321757uL,
        4073807025290796456uL, 8825348881154370363uL, 14734355208981384158uL, 10271039580541631821uL, 5303888135453107960uL, 822984195088142443uL, 9604374506261047041uL, 14391664176758772114uL, 47380625301539367uL, 4780770595170139316uL,
        6781362712661643872uL, 2084283301222999283uL, 15852106237007281990uL, 11028505464239851989uL, 1670654249350217407uL, 6187869865390245932uL, 10578560694269006745uL, 15005564104267687178uL, 12269926345859042865uL, 16768987096479742114uL,
        3433514057002836759uL, 7878672873577829764uL, 16389988026750624494uL, 11638443477897467005uL, 7391863372946608072uL, 2622728278751721819uL, 4044590402276644751uL, 8850035479350698268uL, 13673076206955870889uL, 18388311311405091898uL,
        8147614050581592912uL, 3738764100714335683uL, 17650697762308740726uL, 13115328684529279205uL, 15709965168302367023uL, 11021966344253216700uL, 6909860770376862729uL, 2095335087373712026uL, 10607776270906215920uL, 15115916238825782115uL,
        1645968390176284886uL, 6063892853452478021uL, 5216239979862816913uL, 762004938812542466uL, 14808413130408695223uL, 10336584279807992612uL, 94761250603078734uL, 4872975272980325085uL, 9561541190340278632uL, 14285852213486374907uL,
        13562725425323287744uL, 18359094313119879763uL, 4168566602445998566uL, 8874722219015798645uL, 17657238303940757535uL, 13257468400305012364uL, 8136561383943382329uL, 3610266854770152362uL, 3341308498700434814uL, 7831293060043656173uL,
        12375739730780491864uL, 16811819059476047563uL, 7452841817450123681uL, 2710377314828461874uL, 16324444680414493831uL, 11564384134825822740uL, 1621282580641819377uL, 6093108618008534114uL, 10636992411005044695uL, 15091230119249932612uL,
        6867028114005673518uL, 2142715359940571325uL, 15757345747155659528uL, 10979133309658045851uL, 9518708972583580495uL, 14333231979791697372uL, 142141253402664553uL, 4830142882085382394uL, 14783726745893216144uL, 10365800689136969987uL,
        5245456557503443638uL, 737318311902463013uL, 8089180804553289502uL, 3653099890976004493uL, 17700070958701396536uL, 13210088128275084459uL, 4139350461810230209uL, 8899408340202190162uL, 13587411233247080167uL, 18329878549100632180uL,
        16295228101163185824uL, 11589070762272702515uL, 7477528201428671366uL, 2681160907110034709uL, 12328359726370364031uL, 16854651450907929836uL, 3384140715920324441uL, 7783913295349006794uL, 17796789492404876493uL, 12973186262895182430uL,
        8294265019745835499uL, 3597188614796881784uL, 13819721540753725458uL, 18246723593521770113uL, 4190670174747424052uL, 8707887697765516199uL, 7249714899603402099uL, 2768808468102880224uL, 16248400991498780757uL, 11785088403942012614uL,
        3291936780352569772uL, 8025325358597240639uL, 12127785706904956042uL, 16915077318774037017uL, 10432479959725633826uL, 15147713122803500977uL, 1524009877625084932uL, 6329456346323069591uL, 15705454305770282493uL, 11170082187107838830uL,
        6635271944638132443uL, 2226424485906433608uL, 189522501206157468uL, 4634679410803088911uL, 9745950545960650170uL, 14245012653811987241uL, 5445476407655580739uL, 676338306971005648uL, 14876502445374089573uL, 10124960353263198198uL,
        4215391513593610003uL, 8678706776937023872uL, 13790540925671641653uL, 18271444552530207910uL, 8337133204891997132uL, 3549843186494580063uL, 17749444438031597290uL, 13016054137459951737uL, 12170653315997410989uL, 16867732534171963454uL,
        3244592164593781643uL, 8068192726900473112uL, 16273122767886764658uL, 11755906975779290337uL, 7220533709540304724uL, 2793530071884239303uL, 6682616997400869628uL, 2183556611878603887uL, 15662586120087312346uL, 11217427617020813641uL,
        1553190491096487459uL, 6304735387851432112uL, 10407758620342516485uL, 15176894045242543510uL, 14905683634900247362uL, 10100238751092381137uL, 5420754629656923748uL, 705519735670536439uL, 9793295161182637981uL, 14202145287119436046uL,
        146654890503152315uL, 4682024195942093864uL, 3242565161283638754uL, 7930564333232481137uL, 12186217236017068228uL, 17000743249723264599uL, 7335380351123765565uL, 2827240748300537774uL, 16153640314560107547uL, 11735716164790313608uL,
        13734056228011347036uL, 18188291445129067215uL, 4285430719881142650uL, 8757259798139230185uL, 17846161249714921603uL, 13067947420601767440uL, 8235833358291897765uL, 3511522545606540086uL, 5387043107155988493uL, 590673871457609374uL,
        14925875833148783915uL, 10219719885873843128uL, 284282506805329106uL, 4684052045342640705uL, 9660285764170764788uL, 14186579979835500391uL, 15610694155489642931uL, 11120709418076880672uL, 6720936860919424149uL, 2284857304564388358uL,
        10490913115006887276uL, 15233377424362361855uL, 1474636623804926026uL, 6234696958930763481uL, 16178361609106579004uL, 11706535215248140463uL, 7306199781952008986uL, 2851961734412043657uL, 12229085463316509411uL, 16953397843693241456uL,
        3195220067441434565uL, 7973432182840617302uL, 8278700923620460418uL, 3464177731752866065uL, 17798816680404380324uL, 13110814815472245815uL, 4310152537884486493uL, 8728078392784608718uL, 13704874997943502459uL, 18213013024491712744uL,
        9707630858549910483uL, 14143712128616820032uL, 241414281116563189uL, 4731397450835853414uL, 14955056402857342732uL, 10194998898151653791uL, 5362321814220069418uL, 619854820462849209uL, 1503817855483314797uL, 6209975379031176446uL,
        10466191297540353867uL, 15262558828106308056uL, 6768281431840648882uL, 2241989909157107745uL, 15567826590698013588uL, 11168054230320002311uL,
    };

    internal static int GetInterfaceId(Type type)
    {
        string text = ((MemberInfo)type).Name;
        if (type.Namespace != null)
        {
            text = string.Concat(type.Namespace, text);
        }

        int interfaceId = (int)ToCRC64(Encoding.UTF8.GetBytes(text));
        return interfaceId;
    }

    internal static int GetMethodId(MethodInfo methodInfo)
    {
        string text = methodInfo.Name;
        if (methodInfo.DeclaringType != null)
        {
            if (methodInfo.DeclaringType.Namespace != null)
            {
                text = methodInfo.DeclaringType.Namespace + text;
            }

            text = methodInfo.DeclaringType.Name + text;
        }

        int methodId = (int)ToCRC64(Encoding.UTF8.GetBytes(text));
        return methodId;
    }

    private static ulong ToCRC64(byte[] value)
    {
        ulong num = 18446744073709551615uL;
        for (int i = 0; i < value.Length; i++)
        {
            uint num2 = (uint)((int)(num >> 56) ^ value[i]) & 0xFFu;
            num = Crc64Table[num2] ^ (num << 8);
        }

        return num ^ 0xFFFFFFFFFFFFFFFFuL;
    }
}
